package DA;

import BE.BEAlmacen;

import java.sql.*;
import javax.swing.JOptionPane;

public class DAAlmacen 
{
    public void agregarAlmacenCargaMasiva(BEAlmacen almacen)
    {
        DAConexion bd = new DAConexion();
        Connection con = null;
        PreparedStatement s = null;

        String query = "";
        String query1 = "INSERT INTO ALMACEN VALUES (" + almacen.getIdalmacen() + 
                        ",'"+ almacen.getNombre() +"','" + almacen.getDireccion() +"',"
                      + almacen.getTelefono() + "," + almacen.getAncho() +","+ almacen.getLargo() +");\n";
        String query2 = "";
        
        for (int i=1;i<almacen.getAncho()+1;i++)
            for (int j=1;j<almacen.getLargo()+1;j++)
                query2 += "INSERT INTO POSICIONRACK (X,Y,ESTADO) VALUES (" + i + "," + j + ",'0');\n";
        
        query += query1+query2;
        try
        {
            con = bd.conectar();
            s = con.prepareStatement(query);
            s.execute();
            bd.cierraConexion(con);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,"Problemas al momento de insertar datos"+e,
                        "Error",JOptionPane.ERROR_MESSAGE);
            bd.cierraConexion(con);;
        }
        
    }
    
    public BEAlmacen getParametrosAlmacen ()
    {
        BEAlmacen beAlmacen = new BEAlmacen(); 
        DAConexion bd = new DAConexion();
        Connection con = null;
        ResultSet rs = null;
        Statement s = null;
        
        String query = "SELECT * FROM ALMACEN";

        try
        {
            con = bd.conectar();
            s = con.createStatement();
            rs = s.executeQuery(query);
            
            while (rs.next())
            {                
                beAlmacen.setIdalmacen(rs.getInt("IDALMACEN"));
                beAlmacen.setNombre(rs.getString("NOMBRE"));
                beAlmacen.setDireccion(rs.getString("DIRECCION"));
                beAlmacen.setTelefono(rs.getInt("TELEFONO"));
                beAlmacen.setAncho(rs.getInt("ANCHO"));
                beAlmacen.setLargo(rs.getInt("LARGO"));
            }

        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,"Problema al consultar la base de datos",
                                          "Error",JOptionPane.ERROR_MESSAGE);
            bd.cierraConexion(con);
            return null;
        }
        
        bd.cierraConexion(con);
        return beAlmacen;
    }
    
    public int getLargobyId ()
    {
        int largo = -1;
        DAConexion bd = new DAConexion();
        Connection con = null;
        ResultSet rs = null;
        Statement s = null;
        
        String query = "SELECT LARGO FROM ALMACEN WHERE IDALMACEN = 1";

        try
        {
            con = bd.conectar();
            s = con.createStatement();
            rs = s.executeQuery(query);
            
            while (rs.next())
            {                
                largo = rs.getInt("LARGO");
            }

        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,"Problema al consultar la base de datos",
                                          "Error",JOptionPane.ERROR_MESSAGE);
            bd.cierraConexion(con);
            return largo;
        }
        
        bd.cierraConexion(con);
        return largo;
    }
    
    public int getAnchobyId ()
    {
        int ancho = -1;
        DAConexion bd = new DAConexion();
        Connection con = null;
        ResultSet rs = null;
        Statement s = null;
        
        String query = "SELECT ANCHO FROM ALMACEN WHERE IDALMACEN = 1";

        try
        {
            con = bd.conectar();
            s = con.createStatement();
            rs = s.executeQuery(query);
            
            while (rs.next())
            {                
                ancho = rs.getInt("ANCHO");
            }

        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,"Problema al consultar la base de datos",
                                          "Error",JOptionPane.ERROR_MESSAGE);
            bd.cierraConexion(con);
            return ancho;
        }
        
        bd.cierraConexion(con);
        return ancho;
    }
    
    public int updateAlmacen (BEAlmacen beAlmacen)
    {
        
        DAConexion bd = new DAConexion();
        Connection con = null;
        Statement s = null;
        String query = "UPDATE ALMACEN SET NOMBRE = '" + beAlmacen.getNombre() + "', "
                     + "DIRECCION = '" + beAlmacen.getDireccion() + "', TELEFONO = "
                     + beAlmacen.getTelefono();

        try
        {
            con = bd.conectar();
            s = con.createStatement();
            s.executeUpdate(query);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,"Problemas al momento de actualizar datos","Error",
                                          JOptionPane.ERROR_MESSAGE);
            bd.cierraConexion(con);
            return 1;
        }

        bd.cierraConexion(con);
        return 0;
    }
    
    public boolean isOccupied (int x, int y)
    {
        DAConexion bd = new DAConexion();
        Connection con = null;
        ResultSet rs = null;
        Statement s = null;
        String query = "SELECT COUNT(IDPOSICION) AS CANTIDAD "
                     + "FROM POSICIONRACK WHERE ESTADO = '1' AND X = " + x + " AND Y = " + y;

        try
        {
            con = bd.conectar();
            s = con.createStatement();
            rs = s.executeQuery(query);

            rs.next();
            if (rs.getInt("CANTIDAD") > 0)
                return true;
        } catch (Exception e) {
            bd.cierraConexion(con);
            return false;
        }

        bd.cierraConexion(con);
        return false;
    }
    
    public int creaMalla (int ancho, int largo)
    {
        DAConexion bd = new DAConexion();
        Connection con = null;
        Statement s = null;
        
        int anchoAnt = this.getAnchobyId();
        int largoAnt = this.getLargobyId();
        boolean hayRack = false;
        
        String query = "";
        
//        for (int i=0;i<=ancho;i++)
//            for (int j=0;j<=largo;j++)
//                query += "INSERT INTO POSICIONRACK (X,Y,ESTADO) VALUES ("
//                          + i + "," + j + ",0);\n";
//        query += "UPDATE ALMACEN SET ANCHO = " + ancho + " WHERE IDALMACEN = 1;\n";
//        query += "UPDATE ALMACEN SET LARGO = " + largo + " WHERE IDALMACEN = 1;\n";
        if (ancho > anchoAnt)
        {
            for (int i=anchoAnt+1;i<=ancho;i++)
                for (int j=1;j<=largoAnt;j++)
                    query += "INSERT INTO POSICIONRACK (X,Y,ESTADO) VALUES ("
                            + i + "," + j + ",0);\n";
            query += "UPDATE ALMACEN SET ANCHO = " + ancho + " WHERE IDALMACEN = 1;\n";
        }
        else if (ancho < anchoAnt) 
        {
            for (int i=anchoAnt;i>ancho;i--) //
                for (int j=1;j<=largoAnt;j++)
                    if (isOccupied(i,j))
                    {
                        hayRack = true;
                        //break;
                        return 2;
                    }
                    else
                        query += "DELETE FROM POSICIONRACK WHERE X = " + i + " AND Y = " + j + ";\n";
            if (!hayRack)
                query += "UPDATE ALMACEN SET ANCHO = " + ancho + " WHERE IDALMACEN = 1;\n";
        }
        
        if (largo > largoAnt)
        {
            for (int i=largoAnt+1;i<=largo;i++)
                for (int j=1;j<=ancho;j++)
                    query += "INSERT INTO POSICIONRACK (X,Y,ESTADO) VALUES ("
                            + j + "," + i + ",0);\n";
            query += "UPDATE ALMACEN SET LARGO = " + largo + " WHERE IDALMACEN = 1;\n";
        }
        else if  (largo < largoAnt)
        {
            for (int i=largoAnt;i>largo;i--) //
                for (int j=1;j<=anchoAnt;j++)
                    if (isOccupied(j,i))
                    {
                        hayRack = true;
                        //break;
                        return 2;
                    }
                    else
                        query += "DELETE FROM POSICIONRACK WHERE X = " + j + " AND Y = " + i + ";\n";
            if (!hayRack)
                query += "UPDATE ALMACEN SET LARGO = " + largo + " WHERE IDALMACEN = 1;\n";
        }
        
        try
        {
            con = bd.conectar();
            s = con.createStatement();
            s.executeUpdate(query);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,"Problemas al momento de actualizar datos","Error",
                                          JOptionPane.ERROR_MESSAGE);
            bd.cierraConexion(con);
            return 2;
        }

        bd.cierraConexion(con);
        return 0;
    }
}
